package reflect;

import reflect.annotations.AutoRunClass;
import reflect.annotations.AutoRunMethod;

import java.io.File;
import java.lang.reflect.Method;
import java.net.URISyntaxException;

/**
 * 自动调用与当前类Test4在同一包中被注解@AutoRunClass标注的类中那些被@AutoRunMethod
 * 标注的放啊制定此(次数有注解@AutoRunMethod的参数指定)
 */
public class Test5 {
    public static void main(String[] args) throws Exception {
        File dir = new File(Test5.class.getResource(".").toURI());
        File[] subs = dir.listFiles(f -> f.getName().endsWith(".class"));
        //遍历文件
        for (File file : subs) {
            String fileName = file.getName().replace(".class", "");
            Class cls = Class.forName(Test5.class.getPackage().getName() + "." + fileName);
            //如果被AutoRunClass注解则true
            if (cls.isAnnotationPresent(AutoRunClass.class)) {
                Method[] methods = cls.getDeclaredMethods();
                //遍历每个类中的方法列表
                for (Method m : methods) {
                    //如果被AutoRunMethod注解则true
                    if (m.isAnnotationPresent(AutoRunMethod.class)) {
                        //实例化该类的对象
                        Object obj = cls.newInstance();
                        //获取注解的参数
                        AutoRunMethod arm = m.getAnnotation(AutoRunMethod.class);
                        int value = arm.value();
                        System.out.println("正在调用:"+m.getName()+"()方法"+value+"次");
                        //循环调用value遍
                        for (int i = 0; i < value; i++) {
                            m.invoke(obj);
                        }
                    }
                }
            }
        }
    }
}
